#ifndef __FUNC_H__
#define __FUNC_H__

#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <time.h>

#define msleep(x) usleep(1000*x)

/**
 * @brief  删除结构体数组指定元素
 * @date   2023-10-09 10:28:11
 * @author xiaole
 * @param  *parr     数组
 * @param  *ptotal   数组最大值
 * @param  index    需要删除的元素的下标
 * @param  sizeof_struct    结构体类型大小如 sizeof(struct MyStruct)
 * @note   
 */
#define delete_struct_array_element(parr, ptotal, index, sizeof_struct)             \
    do{                                                                             \
        if( 0<=index && index < *ptotal){                                           \
            memmove(parr[index], parr[index +1], (*ptotal-index-1)*sizeof_struct);  \
            (*ptotal)--;                                                            \
        }else{LOG_RED("del element(%d) fail...\n", index);}                         \
    }while(0)

/**
 * @brief  按位赋值, 负数好像每弄好...
 * @date   2023-03-02 10:13
 * @author xiaole
 * @return true/false   
 * @param  num 给谁赋值
 * @param  src 赋值多少
 * @param  bit 赋值哪些 
 * 低八[0x000000FF], 高八[0x0000FF00], [0x00FF0000], [0xFF000000]...
 * @note   eg: bin_set_bit(&num, 0x45, 0x0000FF00), 将num 的高八位赋值为0x45
 */
bool bin_set_bit(unsigned int *num, long src, const long long bit);

/**
 * @brief  按位取值
 * @date   2023-03-02 10:20
 * @author xiaole
 * @return 取得的数值
 * @param num 取谁的
 * @param bit 取哪些
 * 低八[0x000000FF], 高八[0x0000FF00], [0x00FF0000], [0xFF000000]...
 */
int bin_get_bit(int num, int bit);

/**
 * @brief  打印数字的二进制形式
 * @date   2023-01-11 10:39
 * @note   一个printf里面只能调用1次， 不人前面用的会被后面的覆盖掉
 */
const char *bin_print(int num);

/**
 * @brief  文件是否存在
 * @date   2023-02-06 08:29
 * @author xiaole
 * @param  file_path 文件路径
 */
bool file_is_exists(const char *file_path);

/**
 * @brief  获取指定路径下， 存在的文件数量
 * @date   2023-03-15 16:32
 * @author xiaole
 */
int file_get_num(const char *path);


/**
 * @brief  月份字符串转成数字
 * @date   2023-03-18 15:13
 * @author xiaole
 * @return 对应的数字，  May -> 5， 无效时，返回0
 * @param  str 必须输入指定的才行， 
 * @note   有效字符， 用strncmp() 对比前3个字符
 *         "Jan", "Feb", "Mar", "Apr",
           "May", "Jun", "Jul", "Aug",
           "Sep", "Oct", "Nov", "Dec",
 */
int month_str_to_num(const char* str);


/**
 * @brief  get_rand
 * @date   2023-06-15 10:44
 * @author xiaole
 * @return [min, max]
 * @param  min
 * @param  max
 */
int rand_number_get(int min, int max);


unsigned long long xl_timestamp_get(void);
unsigned long long xl_timestamp_ms_get(void);



#endif /* __FUNC_H__ */